home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Info-Mac 3
/
Info_Mac_1994-01.iso
/
Graphics
/
Utility
/
GL Viewer 1.1.1
/
src ƒ
/
fades.c
< prev
next >
Wrap
Text File
|
1993-09-06
|
13KB
|
581 lines
/*
* Mac hack of
* fades.c - grasp image fader.
*
* Copyright (c) 1991 by Patrick J. Naughton
*/
#pragma segment Fades
#include <stdlib.h>
#include "glassert.h"
#include "grasp.h"
#include "exec.h"
#include "fades.h"
extern void exitcheck (void);
#define FADE_SNAP 0
#define FADE_WIPELR 1
#define FADE_WIPERL 2
#define FADE_WIPESC 3
#define FADE_WIPECS 4
#define FADE_ILACESIM 5
#define FADE_ILACE 6
#define FADE_WIPETLRBRL 7
#define FADE_WIPELLRRLR 8
#define FADE_WIPETB 9
#define FADE_WIPEBT 10
#define FADE_WIPETCBC 11
#define FADE_WIPECTB 12
#define FADE_ILACETBBT 13
#define FADE_WIPETTBBTB 14
#define FADE_WIPELTBRBT 15
#define FADE_QUARTERS 16
#define FADE_COLUMNS 17
#define FADE_DOUBLEINT 18
#define FADE_POUR 19
#define FADE_SPARKLE 20
#define FADE_DIAGONAL 21
#define FADE_OPEN_AP 22
#define FADE_CLOSE_AP 23
#define FADE_CLOCK 24
#define FADE_DOUBLEARC 25
#define ILACEW 16
#define WIPEW 4
#define DIAG_NUM_DELTA_X 16
static void LineDDA (unsigned short a, unsigned short b, short *pPixel);
void
imagefade(fadestyle, im, xo, yo, speed, clip)
int fadestyle;
ImageStruct *im;
int speed;
int xo;
int yo;
int clip;
{
int i;
int j;
int k;
int w = im->w;
int h = im->h;
int halfh = (h + 1) / 2;
int halfw = (w + 1) / 2;
int hpar = h & 1;
int wpar = w & 1;
Pixmap xim = im->pix;
if (((XImage *) xim)->format == TextImage)
{
int lastattr = -1;
// XImage *xim = XGetImage(dsp, xim, 0, 0, w, h, 0xff, ZPixmap);
XImage *pXim = (XImage *) xim;
if (picreg[0] /* != (ImageStruct *) NULL */)
AdjustBackgroundPic (picreg[0]->w, picreg[0]->h);
else
setvideomode ('?');
if (im->cmap /* != (Colormap) NULL */)
{
extern Colormap installedcmap;
XSetWindowColormap (dsp, win, im->cmap);
installedcmap = im->cmap;
}
XSetBlackAndWhite (dsp, win);
for (j = 0; j < h; j++)
{
// char *row = "";
char *row = &pXim->data[j * w];
for (i = 0; i < w / 2;)
{
char s[81];
char attr = 0;
short lenStr;
short ithChar;
char fAllRepeats;
extern void displaystring (char *s, int x, int y);
k = i;
do
{
char attr1 = row[2 * k + 1];
char ch = row[2 * k];
if (ch == 0)
s[k - i] = 32;
else
{
s[k - i] = ch;
if (attr == 0)
{
if (attr1 /* != 0 */)
attr = attr1;
}
else if (attr != attr1)
{
break;
}
}
k++;
} while (k < w / 2);
lenStr = k - i;
s[lenStr] = 0;
if (attr != lastattr)
{
XSetForeground (dsp, gc, attr & 0x0f);
XSetBackground (dsp, gc, (attr >> 4) & 0x0f);
lastattr = attr;
}
// XDrawImageString (dsp, win, gc, i * 8, (j + 1) * 13 - 1, s, lenStr);
fAllRepeats = (lenStr > 1);
for (ithChar = 1; ithChar < lenStr; ithChar++)
{
if (s[0] != s[ithChar])
{
fAllRepeats = 0;
break;
}
}
if (!fAllRepeats)
displaystring (s, i * 8, (j + 1) * 13 - 1);
i = k;
}
}
// free(xim->data);
// free(xim);
return;
}
if (clip)
XSetClipRectangles(dsp, gc, 0, 0, &window, 1, 0);
switch (fadestyle) {
default:
case FADE_SNAP: // 0 -/
XCopyArea(dsp, xim, win, gc,
0, 0, w, h, xo, yo);
break;
case FADE_WIPELR: // 1 -/
for (i = 0; i < w; i += WIPEW)
XCopyArea(dsp, xim, win, gc,
i, 0, WIPEW, h, xo + i, yo);
break;
case FADE_WIPERL: // 2 -/
for (i = w - WIPEW; i > -WIPEW; i -= WIPEW)
XCopyArea(dsp, xim, win, gc,
i, 0, WIPEW, h, xo + i, yo);
break;
case FADE_WIPESC: // 3 -/
for (i = 0; i <= halfw; i += WIPEW) {
XCopyArea(dsp, xim, win, gc,
i, 0, WIPEW, h, xo + i, yo + 0);
XCopyArea(dsp, xim, win, gc,
w - WIPEW - i, 0, WIPEW, h, xo + w - WIPEW - i, yo);
}
break;
case FADE_WIPECS: // 4 -/
for (i = halfw; i >= -WIPEW; i -= WIPEW) {
XCopyArea(dsp, xim, win, gc,
i, 0, WIPEW, h, xo + i, yo);
XCopyArea(dsp, xim, win, gc,
w - WIPEW - i, 0, WIPEW, h, xo + w - WIPEW - i, yo);
}
break;
case FADE_ILACESIM: // 5 -/
for (i = 0; i <= w - ILACEW; i += ILACEW)
for (j = 0; j < h; j += 2) {
XCopyArea(dsp, xim, win, gc,
i, j, ILACEW, 1, xo + i, yo + j);
XCopyArea(dsp, xim, win, gc,
w - ILACEW - i, j + 1, ILACEW, 1,
xo + w - ILACEW - i, yo + j + 1);
}
break;
case FADE_ILACE: // 6 -/
for (i = 0; i <= w - ILACEW; i += ILACEW)
for (j = 0; j < h; j += 2)
XCopyArea(dsp, xim, win, gc,
i, j, ILACEW, 1, xo + i, yo + j);
exitcheck ();
for (i = 0; i <= w - ILACEW; i += ILACEW)
for (j = 0; j < h; j += 2)
XCopyArea(dsp, xim, win, gc,
w - ILACEW - i, j + 1, ILACEW, 1,
xo + w - ILACEW - i, yo + j + 1);
break;
case FADE_WIPETLRBRL: // 7 -/
for (i = 0; i <= w - WIPEW; i += WIPEW)
XCopyArea(dsp, xim, win, gc,
i, halfh, WIPEW, h - halfh, xo + i, yo + halfh);
exitcheck ();
for (i = w - WIPEW; i > -WIPEW; i -= WIPEW)
XCopyArea(dsp, xim, win, gc,
i, 0, WIPEW, halfh, xo + i, yo);
break;
case FADE_WIPELLRRLR: // 8 -/
for (i = 0; i < halfw; i += WIPEW) {
XCopyArea(dsp, xim, win, gc,
i, 0, WIPEW, h, xo + i, yo);
XCopyArea(dsp, xim, win, gc,
halfw + i, 0, WIPEW, h, xo + halfw + i, yo);
}
break;
case FADE_WIPETB: // 9 -/
for (j = 0; j < h; j++)
XCopyArea(dsp, xim, win, gc,
0, j, w, 1, xo, yo + j);
break;
case FADE_WIPEBT: // 10 -/
for (j = h; j >= 0; j--)
XCopyArea(dsp, xim, win, gc,
0, j, w, 1, xo, yo + j);
break;
case FADE_WIPETCBC: // 11 -/
for (j = 0; j < halfh + hpar; j++) {
XCopyArea(dsp, xim, win, gc,
0, j, w, 1, xo, yo + j);
XCopyArea(dsp, xim, win, gc,
0, h - j - 1, w, 1, xo, yo + h - j - 1);
}
break;
case FADE_WIPECTB: // 12 -/
for (j = halfh + hpar - 1; j >= 0; j--) {
XCopyArea(dsp, xim, win, gc,
0, j, w, 1, xo, yo + j);
XCopyArea(dsp, xim, win, gc,
0, h - j - 1, w, 1, xo, yo + h - j - 1);
}
break;
case FADE_ILACETBBT: // 13 -/
for (j = 0; j < h; j += 2) {
XCopyArea(dsp, xim, win, gc,
0, j, w, 1, xo, yo + j);
XSync(dsp, False);
}
exitcheck ();
for (j = h - 1 - hpar; j > 0; j -= 2) {
XCopyArea(dsp, xim, win, gc,
0, j, w, 1, xo, yo + j);
XSync(dsp, False);
}
break;
case FADE_WIPETTBBTB: // 14 -/
for (j = 0; j < halfh + hpar; j++) {
XCopyArea(dsp, xim, win, gc,
0, j, w, 1, xo, yo + j);
XCopyArea(dsp, xim, win, gc,
0, halfh + j, w, 1, xo, yo + halfh + j);
XSync(dsp, False);
}
break;
case FADE_WIPELTBRBT: // 15 -/
for (j = 0; j < h; j++) {
XCopyArea(dsp, xim, win, gc,
0, j, halfw, 1, xo, yo + j);
XCopyArea(dsp, xim, win, gc,
halfw, h - j, halfw, 1, xo + halfw, yo + h - j);
XSync(dsp, False);
}
break;
case FADE_QUARTERS: // 16 -/
// top left, top to bottom -/
for (j = 0; j <= halfh + hpar; j++) {
XCopyArea(dsp, xim, win, gc,
0, j, halfw + wpar, 1, xo, yo + j);
XSync(dsp, False);
}
exitcheck ();
// bottom right, top to bottom -/
for (j = halfh + hpar; j < h; j++) {
XCopyArea(dsp, xim, win, gc,
halfw + wpar, j, halfw, 1, xo + halfw + wpar, yo + j);
XSync(dsp, False);
}
exitcheck ();
// bottom left, bottom to top -/
for (j = h; j >= halfh; j--) {
XCopyArea(dsp, xim, win, gc,
0, j, halfw + wpar, 1, xo, yo + j);
XSync(dsp, False);
}
exitcheck ();
// top right, bottom to top -/
for (j = halfh; j >= 0; j--) {
XCopyArea(dsp, xim, win, gc,
halfw + wpar, j, halfw, 1, xo + halfw + wpar, yo + j);
XSync(dsp, False);
}
break;
case FADE_COLUMNS: // 17 -/
for (j = 0; j < h; j += 2)
for (i = 0; i < w; i += 16)
XCopyArea(dsp, xim, win, gc,
i, j, 8, 2, xo + i, yo + j);
exitcheck ();
for (j = h - 1; j >= -1; j -= 2)
for (i = 8; i < w; i += 16)
XCopyArea(dsp, xim, win, gc,
i, j, 8, 2, xo + i, yo + j);
break;
case FADE_DOUBLEINT: // 18 -/
for (j = 0; j < h; j += 2)
for (i = 0; i < w; i += 16)
XCopyArea(dsp, xim, win, gc,
i, j, 8, 1, xo + i, yo + j);
exitcheck ();
for (j = h - 1; j >= 0; j -= 2)
for (i = 8; i < w; i += 16)
XCopyArea(dsp, xim, win, gc,
i, j, 8, 1, xo + i, yo + j);
exitcheck ();
for (j = 1; j < h; j += 2)
for (i = 0; i < w; i += 16)
XCopyArea(dsp, xim, win, gc,
i, j, 8, 1, xo + i, yo + j);
exitcheck ();
for (j = h - 2; j >= 0; j -= 2)
for (i = 8; i < w; i += 16)
XCopyArea(dsp, xim, win, gc,
i, j, 8, 1, xo + i, yo + j);
break;
case FADE_POUR: // 19 -/
for (j = h - 1; j >= 0; j -= WIPEW)
{
for (i = 0; i < j; i++)
XCopyArea(dsp, xim, win, gc,
0, j, w, WIPEW, xo + 0, yo + i);
exitcheck ();
}
break;
case FADE_SPARKLE: // 20 -/
{
int boxsize = (w + 19) / 20; //(w + 39) / 40;
int cols = (w + (boxsize - 1)) / boxsize;
int boxcount = (h + (boxsize - 1)) / boxsize * cols;
int *order = (int *) malloc((size_t) boxcount * sizeof(int));
assert (order);
(void) srand(getpid());
for (i = 0; i < boxcount; i++)
order[i] = i;
for (i = 0; i < boxcount * boxsize; i++) {
int i1 = rand() % boxcount;
int i2 = rand() % boxcount;
j = order[i1];
order[i1] = order[i2];
order[i2] = j;
}
exitcheck ();
for (i = 0; i < boxcount; i++) {
int x = (order[i] % cols) * boxsize;
int y = (order[i] / cols) * boxsize;
XCopyArea(dsp, xim, win, gc,
x, y, boxsize, boxsize, xo + x, yo + y);
}
free(order);
}
break;
case FADE_DIAGONAL: // 21 -/
{
short maxDim = (w > h) ? w : h;
short delta = maxDim / DIAG_NUM_DELTA_X;
short x1;
short x2;
for (x1 = -maxDim, x2 = x1 + delta;
x1 < maxDim;
x1 += delta, x2 += delta)
{
for (i = 0; i < maxDim; i++)
{
short xx1 = x1 + i;
short xx2 = x2 + i;
if (xx1 < 0)
xx1 = 0;
if (xx2 < 0)
xx2 = 0;
if (xx1 > w)
xx1 = w;
if (xx2 > w)
xx2 = w;
if (xx1 < xx2)
{
short y = maxDim - i;
if (y < 0 || y > h)
continue;
XCopyArea (dsp, xim, win, gc,
xx1, y, xx2 - xx1, 1, xx1, y);
}
}
exitcheck ();
}
break;
}
case FADE_OPEN_AP: // 22 -/
for (i = 0; i <= MAX(w, h) / 2; i += WIPEW) {
// left wedge -/
XCopyArea(dsp, xim, win, gc,
halfw - i, halfh - i, WIPEW, 2 * i,
xo + halfw - i, yo + halfh - i);
// top wedge -/
XCopyArea(dsp, xim, win, gc,
halfw - i, halfh - i, 2 * i, WIPEW,
xo + halfw - i, yo + halfh - i);
// right wedge -/
XCopyArea(dsp, xim, win, gc,
halfw + i, halfh - i, WIPEW, 2 * i + WIPEW,
xo + halfw + i, yo + halfh - i);
// bottom wedge -/
XCopyArea(dsp, xim, win, gc,
halfw - i, halfh + i, 2 * i + WIPEW, WIPEW,
xo + halfw - i, yo + halfh + i);
XSync(dsp, False);
}
break;
case FADE_CLOSE_AP: // 23 -/
for (i = MAX(w, h) / 2; i >= 0; i -= WIPEW) {
// left wedge -/
XCopyArea(dsp, xim, win, gc,
halfw - i, halfh - i, WIPEW, 2 * i,
xo + halfw - i, yo + halfh - i);
// top wedge -/
XCopyArea(dsp, xim, win, gc,
halfw - i, halfh - i, 2 * i, WIPEW,
xo + halfw - i, yo + halfh - i);
// right wedge -/
XCopyArea(dsp, xim, win, gc,
halfw + i, halfh - i, WIPEW, 2 * i + WIPEW,
xo + halfw + i, yo + halfh - i);
// bottom wedge -/
XCopyArea(dsp, xim, win, gc,
halfw - i, halfh + i, 2 * i + WIPEW, WIPEW,
xo + halfw - i, yo + halfh + i);
XSync(dsp, False);
}
break;
case FADE_CLOCK: // 24 -/// not implemented -/
XCopyArea(dsp, xim, win, gc,
0, 0, w, h, xo, yo);
break;
case FADE_DOUBLEARC: // 25 -/// not implemented -/
XCopyArea(dsp, xim, win, gc,
0, 0, w, h, xo, yo);
break;
}
XSetClipMask(dsp, gc, None);
XSync(dsp, False);
}
/*
* Bresenham's line Digital Differential Analyzer (DDA)
*
* a >= b > 0, pPixel = (short *) malloc (sizeof (short) * a)
*
*/
static void
LineDDA (unsigned short a, unsigned short b, short *pPixel)
{
unsigned short x = 0;
unsigned short y = 0;
short d = b - (a >> 1);
short stride = b - a;
unsigned short i;
for (i = 0; i < a; i++)
{
*pPixel++ = y;
if (d < 0)
{
x++;
d += b;
}
else
{
x++;
y++;
d += stride;
}
}
}